package com.lz;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;

import java.util.Scanner;

/**
 * 生产者
 */
public class Producer {
    public static void main(String[] args) throws Exception {
        String exchangeName = "lz_exchange";
        String queueName = "lz_queue";
        Channel channel = RabbitMQConnector.createConnectionAndChannel();

        /**
         * 创建交换机
         * 1.交换机名称
         * 2.交换机类型，direct，topic，fanout和headers
         * 3.指定交换机是否需要持久化，如果设置为true，那么交换机的元数据要持久化
         * 4.指定交换机在没有队列绑定时，是否需要删除，设置false表示不删除
         * 5.Map<String,Object>类型，用来指定我们交换机其他的一些结构化参数
         */
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, null);

        /**
         * 创建队列
         * 1.队列的名称
         * 2.是否持久化，如果设置为true，那么队列名称等这些元数据会持久化，而不是队列中消息数据的持久化
         * 3.是否排外，如果设置为true，那么只有当前连接的消费者才能消费队列中的消息，其他连接的消费者无法消费队列中的消息
         * 4.是否自动删除，如果设置为true，那么当队列中没有绑定的消费者时，队列会自动删除
         * 5.Map<String,Object>类型，用来指定我们队列的其他一些结构化参数，如死信队列等
         */
        channel.queueDeclare(queueName, true, false, false, null);

        /**
         * 绑定队列和交换机
         * 1.队列名称
         * 2.交换机名称
         * 3.路由键，在直连模式下，可以为我们的队列名称
         */
        channel.queueBind(queueName, exchangeName, queueName);

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入消息：");
        // 发送消息
        String message = scanner.nextLine();

        /**
         * 发送消息
         * 1.发送到哪个交换机
         * 2.队列名称
         * 3.其他参数信息
         * 4.消息主体
         */
        channel.basicPublish(exchangeName, queueName, null, message.getBytes());
        RabbitMQConnector.closeResources();
    }
}
